import pymysql  
from sqlalchemy import create_engine  
import os
import datetime
import time
# 下面是最新的引入的方法，以前的不能够import
from dbutils.pooled_db import PooledDB

# 定义连接池，设置最大连接数为10  
pool = PooledDB(  
    creator=pymysql,  # 使用来连接  
    maxconnections=10,  # 连接池允许的最大连接数  
    host=os.environ.get('mysql_host'),
    user=os.environ.get('mysql_user'),
    password=os.environ.get('mysql_passwd'),
    database=os.environ.get('mysql_db'),
    charset='utf8'  # 字符集  
)  
  
def getconn():
    # 从连接池中获取一个连接  
    return pool.connection()
  
def getCursor():
    conn = pool.connection()
    return conn.cursor(), conn
  
def execSql(sqlstr):
    # 执行SQL语句  
    cursor, _ = getCursor()
    cursor.execute(sqlstr) 
    closeConn(cursor)

def execUpdate(sqlstr):
    # 执行SQL语句  
    cursor, conn = getCursor()
    cursor.execute(sqlstr)  
    conn.commit()
    closeConn(cursor)
  
def fetchBySql(sqlstr):
    # 获取查询结果 
    cursor, _ = getCursor() 
    cursor.execute(sqlstr)  
    columns = [desc[0] for desc in cursor.description]
    results = cursor.fetchall()
    jresults = []
    for row in results:
        jresults.append(dict(zip(columns, row)))
    closeConn(cursor)
    return results

def fetchOneBySql(sqlstr):
    # 获取查询结果 
    cursor, _ = getCursor() 
    cursor.execute(sqlstr)  
    result = cursor.fetchone()
    columns = [desc[0] for desc in cursor.description]
    jresult = dict(zip(columns, result))
    closeConn(cursor)
    return jresult

def fetchJsonList(tabname, sqlstr):
    # 为了保证传输的数据量，把subtitle的值给去掉
    cursor, _ = getCursor() 
    try:
        cursor.execute(f"SHOW COLUMNS FROM {tabname}")  
        columns = [column[0] for column in cursor.fetchall()]  
        cursor.execute(sqlstr)  
        rows = cursor.fetchall()  
        json_data = []  
        for row in rows:  
            nrow = []
            for r in row:
                if isinstance(r, datetime.datetime):
                    strdmy = r.strftime("%Y-%m-%d %H:%M:%S")
                    nrow.append(strdmy)
                    continue
                nrow.append(r)
            json_data.append(dict(zip(columns, nrow))) 
        json_ndata = []
        # 把json中的subtitle去掉
        for nj in json_data:
            try:
                value = nj["subtitle"]
                nj["subtitle"] = ""
            except KeyError:
                print("no subtitle")
            json_ndata.append(nj)
        return json_ndata
    except Exception as e:
        print(str(e))
    finally:
        closeConn(cursor)
    
def closeConn(cursor):  
    # 关闭游标（注意：不是关闭连接，连接会由连接池管理）  
    cursor.close()  

def createClipSubTask():
    create_table_sql="""
        CREATE TABLE IF NOT EXISTS `clipsubtask` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `corpid` int(11) NOT NULL COMMENT 'subtask的id',
            `cman` int(11) DEFAULT 2 COMMENT '建立人编号',
            `ctime` datetime NOT NULL COMMENT '上传时间',
            `subtaskid` int(11) NOT NULL COMMENT 'subtask的id',
            `tname` varchar(255) NOT NULL COMMENT '任务的名称',
            `tmd5` varchar(50) DEFAULT NULL,
            `uuid1` varchar(50) DEFAULT '' COMMENT '外部编码1',
            `uuid2` varchar(50) DEFAULT '' COMMENT '外部编码2',
            `videopath` varchar(255) DEFAULT NULL COMMENT '本地地址',
            `reviewurl` varchar(255) DEFAULT NULL COMMENT '预览码流的地址',
            `subtitle` varchar(12800) DEFAULT NULL COMMENT '字幕文件',
            `thumbnail` varchar(255) DEFAULT NULL COMMENT '封面',
            `resolution` varchar(10) DEFAULT NULL COMMENT '分辨率',
            `fps` varchar(10) DEFAULT NULL COMMENT '帧率',
            `brate` varchar(10) DEFAULT NULL COMMENT '码率',
            `outurl` varchar(255) DEFAULT NULL COMMENT '视频输出地址(供下载)',
            `process` int(11) NOT NULL DEFAULT 0 COMMENT '0：处理中，1: 处理完成',
            `step` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '1：预处理， 2：剪辑中',
            `btime` datetime DEFAULT NULL COMMENT '开始时间',
            `etime` datetime DEFAULT NULL ON UPDATE current_timestamp() COMMENT '结束时间',
            `reason` varchar(255) DEFAULT NULL COMMENT '原因',
            `status` int(1) NOT NULL DEFAULT 1 COMMENT '-1: 错误，0：取消，1正常 2 完成',
            PRIMARY KEY (`id`)

        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
        """
    try:  
        cursor, conn = getCursor()
        cursor.execute(create_table_sql)  
        conn.commit()
        closeConn(cursor)
    finally:  
        # 关闭连接  
        closeConn(cursor)

def createSubtask():
    create_table_sql="""
        CREATE TABLE IF NOT EXISTS `subtask` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `corpid` int(11) NOT NULL COMMENT '企业编码',
        `tname` varchar(255) NOT NULL COMMENT '任务的名称',
        `cman` int(11) DEFAULT 2 COMMENT '建立人编号',
        `ctime` datetime NOT NULL COMMENT '上传时间',
        `user` varchar(40) NOT NULL DEFAULT '',
        `uuid1` varchar(50) DEFAULT '' COMMENT '外部编码',
        `uuid2` varchar(50) DEFAULT '' COMMENT '外部编码',
        `tmd5` varchar(50) DEFAULT '' COMMENT '外部编码',
        `videourl` varchar(255) DEFAULT NULL,
        `videopath` varchar(255) DEFAULT NULL COMMENT '本地地址',
        `audiourl` varchar(255) DEFAULT NULL COMMENT '音频地址，上传的，或者是由tts生成的',
        `audiopath` varchar(255) DEFAULT NULL COMMENT '本地地址',
        `subtitle` varchar(255) DEFAULT NULL COMMENT '字幕文件',
        `subtitlepath` varchar(255) DEFAULT NULL COMMENT '本地地址',
        `thumbnail` varchar(255) NOT NULL COMMENT '封面',
        `duration` int(11) DEFAULT NULL COMMENT '时长',
        `outurl` varchar(255) DEFAULT NULL COMMENT '视频输出地址',
        `outpath` varchar(255) DEFAULT NULL,
        `resolution` varchar(255) DEFAULT NULL COMMENT '分辩率',
        `en` int(1) DEFAULT 0 COMMENT '是否有英文',
        `process` int(11) NOT NULL DEFAULT 0 COMMENT '进度百分比',
        `step` int(1) NOT NULL DEFAULT 0,
        `level` int(11) NOT NULL DEFAULT 1,
        `serverpid` varchar(50) DEFAULT NULL,
        `reason` varchar(255) DEFAULT NULL COMMENT '原因',
        `ptime` int(11) unsigned zerofill DEFAULT NULL COMMENT '预测用时',
        `btime` datetime DEFAULT NULL COMMENT '开始时间',
        `etime` datetime DEFAULT NULL ON UPDATE current_timestamp() COMMENT '结束时间',
        `status` int(1) NOT NULL DEFAULT 1 COMMENT '状态，1正常 0失败 2完成',
        `mstatus` int(1) NOT NULL DEFAULT 1 COMMENT '状态，1正常 0失败 2完成',
        PRIMARY KEY (`id`)
        ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;            
    """
    try:  
        cursor, conn = getCursor()
        cursor.execute(create_table_sql)  
        conn.commit()
        closeConn(cursor)
    finally:  
        # 关闭连接  
        closeConn(cursor)
